package cn.chinaunicom.mini.program.dingtalk.openapi.service;

import java.util.List;

import com.alibaba.fastjson2.JSON;
import org.springframework.stereotype.Component;

import com.dingtalk.api.request.OapiV2DepartmentGetRequest;
import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
import com.dingtalk.api.request.OapiV2DepartmentListsubidRequest;
import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
import com.dingtalk.api.response.OapiV2DepartmentListsubidResponse;
import com.taobao.api.ApiException;

import cn.chinaunicom.mini.program.dingtalk.openapi.client.IDingTalkClient;
import lombok.extern.slf4j.Slf4j;

/**
 * @ProjectName: dingtalk-adapter
 * @Package: cn.chinaunicom.mini.program.dingtalk.openapi.service
 * @ClassName: DingTalkDeptAPI
 * @Description: 钉钉部门管理接口
 * @Author: wangjc
 * @CreateDate: 2024/6/12
 * @UpdateUser: wangjc
 * @UpdateDate: 2024/6/12
 * @UpdateRemark: 更新内容
 * @Version: 1.0
 */
@Slf4j
@Component
public class DingTalkDeptAPI {
	/**
	 * 列出部门下级部门的基本信息。
	 *
	 * @param req 请求对象，包含部门ID等信息。
	 * @return 返回部门列表的基础响应信息。
	 * @throws ApiException 如果调用钉钉接口失败，则抛出此异常。
	 */
	public List<OapiV2DepartmentListsubResponse.DeptBaseResponse> listDept(OapiV2DepartmentListsubRequest req,
			String accessToken) throws ApiException {
			// 设置请求的语言为中文
		req.setLanguage("zh_CN");
		// 执行请求，获取响应
		OapiV2DepartmentListsubResponse rsp = IDingTalkClient
				.execute("https://oapi.dingtalk.com/topapi/v2/department/listsub", req, accessToken);
		// 打印响应体，用于调试
		log.debug("钉钉开放平台接口响应体：{}", JSON.toJSONString(rsp.getBody()));
		// 返回获取到的部门信息列表
		return rsp.getResult();
	}

	/**
	 * 获取指定部门ID的下级部门ID列表。
	 *
	 * @param req 请求对象，包含部门ID等信息。
	 * @return 返回下级部门ID列表的响应信息。
	 * @throws ApiException 如果调用钉钉接口失败，则抛出此异常。
	 */
	public OapiV2DepartmentListsubidResponse.DeptListSubIdResponse listDeptId(OapiV2DepartmentListsubidRequest req,
			String accessToken) throws ApiException {
		// 执行请求，获取响应
		OapiV2DepartmentListsubidResponse rsp = IDingTalkClient
				.execute("https://oapi.dingtalk.com/topapi/v2/department/listsubid", req, accessToken);
		// 打印响应体，用于调试
		log.debug(rsp.getBody());
		// 返回获取到的下级部门ID列表信息
		return rsp.getResult();
	}

	/**
	 * 获取指定部门的详细信息。
	 *
	 * @param req 请求对象，包含部门ID等信息。
	 * @return 返回部门详细信息的响应信息。
	 * @throws ApiException 如果调用钉钉接口失败，则抛出此异常。
	 */
	public OapiV2DepartmentGetResponse.DeptGetResponse getDeptInfo(OapiV2DepartmentGetRequest req, String accessToken) throws ApiException {
		// 设置请求的语言为中文
		req.setLanguage("zh_CN");
		// 执行请求，获取响应
		OapiV2DepartmentGetResponse rsp = IDingTalkClient
				.execute("https://oapi.dingtalk.com/topapi/v2/department/get", req, accessToken);
		log.debug(rsp.getBody());
		// 返回获取到的部门详细信息
		return rsp.getResult();
	}
}
